import re
import os
import sys

"""

主要优化和改进点：

1. 将代码封装为函数，使其可以被导入和重用
2. 增加了输出目录参数，可以指定代码块保存的位置
3. 添加了目录检查和创建功能
4. 改进了异常处理和用户反馈信息
5. 简化了代码结构，提高了可读性
6. 当未找到文件名时，使用默认文件名格式（code_block_N.txt）
7. 添加了更多注释，方便理解代码功能
8. 命令行参数处理更加健壮

使用方法：
1. 基本用法：`python script.py markdown文件路径`
2. 指定输出目录：`python script.py markdown文件路径 输出目录路径`

这个脚本会提取Markdown文件中的所有代码块，并根据代码块前文本中找到的最后一个文件名（如果有）来保存文件。

"""


def extract_and_save_code_blocks(markdown_filepath, output_dir=None):
    """
    从Markdown文件中提取代码块并保存到指定目录
    #
    Args:
        markdown_filepath: Markdown文件路径
        output_dir: 输出目录，如果未指定则使用Markdown文件所在目录
    """
    # 如果没有指定输出目录，使用Markdown文件所在目录
    if output_dir is None:
        output_dir = os.path.dirname(markdown_filepath)
        if output_dir == '':
            output_dir = '.'
            #
    # 确保输出目录存在
    if not os.path.exists(output_dir):
        try:
            os.makedirs(output_dir)
            print(f"已创建输出目录: {output_dir}")
        except Exception as e:
            print(f"创建输出目录时出错: {e}")
            return
            #
    # 读取文件内容
    try:
        with open(markdown_filepath, 'r', encoding='utf-8') as f:
            content = f.read()
    except Exception as e:
        print(f"读取文件时出错: {e}")
        return
        #
    # 打印原始内容
    print(f"处理文件: {markdown_filepath}")
    #
    # 查找所有代码块以及它们的位置
    code_block_pattern = r'```[\w]*\n([\s\S]*?)\n```'
    pos_pattern = r'```[\w]*\n[\s\S]*?\n```'
    filename_pattern = r'([a-zA-Z0-9_-]+\.[a-zA-Z0-9]+)'
    #
    # 找到所有代码块的内容
    code_blocks = re.findall(code_block_pattern, content)
    #
    # 找到所有代码块的位置
    code_positions = []
    for match in re.finditer(pos_pattern, content):
        code_positions.append((match.start(), match.end()))
        #
    # 如果没有找到代码块，提前结束
    if not code_blocks:
        print("未找到代码块")
        return
        #
    # 处理每个代码块
    print(f"\n找到 {len(code_blocks)} 个代码块:")
    pos_start = 0
    #
    filename_no_name_id =  0
    for i, (code, (start, end)) in enumerate(zip(code_blocks, code_positions), 1):
        # 提取当前代码块之前的文本，用于查找文件名
        filename_block_cue_text = content[pos_start:start]
        filenames_blocks = re.findall(filename_pattern, filename_block_cue_text)
        #
        # 如果找不到文件名，使用默认文件名
        if filenames_blocks:
            current_filename = filenames_blocks[-1]
        else:
            if  filename_no_name_id  == 0 :
                current_filename = f"index.html"
            else:
                current_filename = f"code_blocks-{filename_no_name_id }.txt"
            #
            filename_no_name_id += 1
        # 打印当前处理的代码块信息
        print(f"\n代码块 {i}:")
        print(f"文件名: {current_filename}")
        print(f"位置: 开始={start}, 结束={end}")
        #
        # 组合输出文件的完整路径
        output_filepath = os.path.join(output_dir, current_filename)
        #
        # 保存代码到文件
        try:
            with open(output_filepath, 'w', encoding='utf-8') as f:
                f.write(code)
            print(f"已创建/更新文件: {output_filepath}")
        except Exception as e:
            print(f"保存文件时出错: {e}")
            #
        # 更新下一个代码块的起始位置
        pos_start = end + 1
        #
    print(f"\n处理完成! 所有代码块已保存到: {output_dir}")
    #

def main():
    # 解析命令行参数
    if len(sys.argv) < 2:
        print("用法: python script.py <markdown_filepath> [output_dir]")
        sys.exit(1)
        #
    markdown_filepath = sys.argv[1]
    #
    # 检查markdown文件是否存在
    if not os.path.exists(markdown_filepath):
        print(f"错误: 文件 '{markdown_filepath}' 不存在!")
        sys.exit(1)
        #
    # 如果有指定输出目录，则使用指定的目录
    output_dir = None
    if len(sys.argv) > 2:
        output_dir = sys.argv[2]
        #
    # 提取并保存代码块
    extract_and_save_code_blocks(markdown_filepath, output_dir)
    #

if __name__ == "__main__":
    main()
    #
    #
    #

# python3 md2codes.py  netflix原型设计.md
